///
/// \file    : DetectionAlgorithm.h
/// \version : 1.0
/// \date    : 30 de Enero de 2012
/// \author  : grupo vigilancia
///

#ifndef DETECTIONALGORITHM_H
#define DETECTIONALGORITHM_H

#include <kinematics/util/GeoCoordinate.h>
#include <algorithm>
#include "stdio.h"

using namespace varayoc::kinematics::util;
using namespace std;

namespace varayoc
{
   namespace vigilance
   {
      namespace util
      {
         struct newCoordinatesResult
         {
             Float   newMaxLat;
             Float   newMaxLon;
             Float   newMinLat;
             Float   newMinLon;
         };

         class DetectionAlgorithm
         {
         public:

            DetectionAlgorithm();
            ///
            ///   \brief   Verifica si el track indicado esta dentro del sector de seguridad:
            ///            Circulo, Sector circular & Sector de Anillo
            ///   \return  Verdadero si se encontro que el track esta dentro del sector de seguridad
            Bool  verifyTrackInsideRingSector(  Double   centerLatitude,
                                                Double   centerLongitude,
                                                Float    initialAngle,
                                                Float    spanAngle,
                                                Float    minRadio,     // se recibe en metros
                                                Float    maxRadio,       // se recibe en metros
                                                Double   currentLatitude,
                                                Double   currentLongitude
                                                );

            ///   \brief   verifica si el track indicado esta dentro del sector de seguridad:
            ///            Poligono & Rectangulo
            ///   \return  Verdadero si el track se encuentra dentro del sector de seguridad
            Bool  verifyTrackInsidePolygon(
                                             varayoc::Vector<varayoc::Float64>::Type   m_Latitudes,
                                             varayoc::Vector<varayoc::Float64>::Type   m_Longitudes,
                                             Double   currentLatitude,
                                             Double   currentLongitude
                                             );


            newCoordinatesResult generateNewBoundaryCoordinates(Float maxLat,
                                                                Float maxLon,
                                                                Float minLat,
                                                                Float minLong,
                                                                Float factor
                                                                );

            Vector<String>::Type   calculateUniversalLatLon(Vector<Float64>::Type  Latitudes,
                                                             Vector<Float64>::Type  Longitudes,
                                                             Float factor
                                                             );

         private:

            //The following code is by Randolph Franklin, it returns 1 for interior points and 0 for exterior points.
            int   pnpoly(int npol, float *xp, float *yp, float x, float y);

            GeoCoordinate_ptr m_Center;
            GeoCoordinate_ptr m_Track;

            MeasureConverter  mc;   // Convertidor de unidades
            Double            MNToMts;//  = mc.fromMilesToMeters(1);
         };

      }
   }
}

#endif // DETECTIONALGORITHM_H
